module.exports=app=>{
    const express=require('express')
    const assert=require('http-assert') 
    const jwt=require('jsonwebtoken')
    const AdminUser=require('../../models/AdminUser')
    const router=express.Router({
        //合并url参数
        mergeParams:true
    })
    //新建列表
    router.post('/',async(req,res)=>{
        const model= await req.Model.create(req.body)
        res.send(model)
    })
    //更改列表
    router.put('/:id',async(req,res)=>{
        const model= await req.Model.findByIdAndUpdate(req.params.id,req.body)
        res.send(model)
    })
    router.delete('/:id',async(req,res)=>{
        await req.Model.findByIdAndDelete(req.params.id,req.body)
        res.send({
            success:true
        })
    })
    //查询列表，限制了10行
    router.get('/',async(req,res)=>{
        //条件判断可以决定是否要关联数据
        const queryOptions={}
        if (req.Model.modelName==='Category') {
            queryOptions.populate='parent'
        }
        const items= await req.Model.find().setOptions(queryOptions).limit(100)
        res.send(items)
    })
    //修改列表时input框显示对应初始名 
    router.get('/:id',async(req,res)=>{
        const model= await req.Model.findById(req.params.id)
        res.send(model)
    })

    const authMiddleware=require('../../middleware/auth')
    const resourceMiddleware=require('../../middleware/resource')
    //:resource为动态参数  rest为通用的接口
    app.use('/admin/api/rest/:resource',authMiddleware(),resourceMiddleware(),router)

    
    //装备管理数据处理
    const multer=require('multer')
    const upload=multer({dest:__dirname +'/../../uploads'})
    app.post('/admin/api/upload',authMiddleware(),upload.single('file'),async(req,res)=>{
        const file=req.file
        //filename里面的内容前端是识别不了的，只能通过写成路径的形式
        file.url=`http://test.jehu-test.xyz/uploads/${file.filename}`   //localhost:3000
        res.send(file)
    })

    //登陆的路由
    app.post('/admin/api/login',async(req,res)=>{
        const {username,password}=req.body  //req.body里就有username和password的值，解构赋值即可
        /**
         * 1.根据用户名找用户  无法通过账号和密码同时找到用户，因为密码已经被散列了变成密文了
         * 2.校验密码
         * 3.返回token
         */
        //根据用户名找用户
        //const AdminUser=require('../../models/AdminUser')//在上面引用模型
        const user=await AdminUser.findOne({username}).select('+password')//username:username  select取到password的值
        assert(user,422,'用户不存在')//判断有没有user的内容，false报422的错误，带message'用户不存在'
        // if(!user){
        //     return res.status(422).send({
        //         message:'用户不存在'
        //     })
        // }
        //校验密码
        //项目用了bcrypt的密码进行散列，所以用bcript进行校验
        //compareSync比较明文和密文是否匹配
        //AdminUser对密码设置了select:false,密码是取不到的
        const isValid=require('bcrypt').compareSync(password,user.password)//这是个boolean值
        assert(isValid,422,'密码错误')
        // if(!isValid){
        //     return res.status(422).send({
        //         message:'密码错误'
        //     })
        // }
        //返回token 安装中间件 npm i jsonwebtoken
        //const jwt=require('jsonwebtoken')  //在上面引用
        //跟定义路由时app.get命名是冲突的,通过参数名来判断是定义路由还是获取配置，在这只有一个参数，为获取配置
        const token=jwt.sign({id:user._id},app.get('secret'))
        res.send({token})
    })
    //错误处理函数 捕获异常
    app.use(async(err,req,res,next)=>{
        res.status(err.statusCode||500).send({  //没状态吗就报500
            message:err.message
        })
    })
}